#ifndef IDT_H_
#define IDT_H_

#include <types.h>

#define IDT_FLAGS ((1 << 7) | 0x0E)
#define IDT_FLAGS_RING0 (0 << 5)
#define IDT_FLAGS_RING1 (1 << 5)
#define IDT_FLAGS_RING2 (2 << 5)
#define IDT_FLAGS_RING3 (3 << 5)

typedef void(*f_isr)(int vector, int code);

typedef struct idt_entry
{
	word base_lo;
	word selector;
	byte zero;
	byte flags;
	word base_hi;
} __attribute__((packed)) idt_entry_t;

typedef struct idt_ptr 
{
	word limit;
	dword base;
} __attribute__((packed)) idt_ptr_t;

void init_idt(void);
f_isr idt_set_isr(int index, f_isr isr);
void idt_set_entry(int index, dword base, word selector, byte flags);
idt_entry_t idt_get_entry(int index);
void idt_install(void);
extern void __idt_install(void);

extern void(*isr_table[256])(int vector, int code);

#endif /*IDT_H_*/
